
//
// !!!修改文件后调用 npm run buildJs 生成 ui-utils-all.js
//

"use strict";

import jQuery from 'jquery';
import { uiUtils } from "./ui-utils-core";
import { globalUtils } from '../global-utils/global-utils-all';

/* SOURCE-CODE-START */

var _dataGrid = {};
uiUtils.dataGrid = _dataGrid;

/**
 * @namespace uiUtils-dataGrid
 */

/**
 * @memberof uiUtils-dataGrid
 * @description 初始表格
 * @param {jQuery} jqElement 
 * @param {*} [opts] - 方法 $().bootstrapTable([arg]) 的参数
 * @param {*} [opts.customQuery] - 允许添加额外的查询参数
 * @param {boolean} [opts.convertEmptyStringToNull] - 把 opts.customQuery 中的空字符串转换成 null 值, 值默认是 true 转换
 * @returns {jQuery}
 */
_dataGrid.init = function (jqElement, opts) {
  if (globalUtils.isNullOrUndefined(jqElement)) {
    throw new Error('argument#0 "jqElement" is null/undefined');
  }

  opts = globalUtils.emptyObjectIfNullOrUndefined(opts);
  var customQuery = globalUtils.emptyObjectIfNullOrUndefined(opts.customQuery);

  if (!(opts.convertEmptyStringToNull === false)) {
    // 空字符串转换成 null 值
    customQuery = globalUtils.convertEmptyStringToNull(customQuery);
  }

  var initOpts = {
    // 默认请求方式是 POST 方式
    method: 'post',
    queryParamsType: '',
    // 默认分页
    pagination: true,
    // 默认每页最多 10 条
    pageSize: 10,
    // 默认服务端分页
    sidePagination: 'server',
    ajaxOptions: {

    },
    queryParams: function (params) {
      var newParams = globalUtils.mergeObjects(customQuery, params);

      return newParams;
    },
    responseHandler: function (res) {
      // 适配后端返回的数据格式
      return {
        total: res.total,
        rows: res.data
      };
    }
  };

  var newOpts = globalUtils.mergeObjects(initOpts, opts);
  jqElement.bootstrapTable(newOpts);

  return jqElement;
};

/**
 * @memberof uiUtils-dataGrid
 * @description 刷新表格
 * @param {jQuery} jqElement 
 * @returns {jQuery}
 */
_dataGrid.refresh = function (jqElement) {
  if (globalUtils.isNullOrUndefined(jqElement)) {
    throw new Error('argument#0 "jqElement" is null/undefined');
  }


  jqElement.bootstrapTable('refresh');
  return jqElement;
};

/**
 * @memberof uiUtils-dataGrid
 * @description 新的查询
 * @param {jQuery} jqElement 
 * @param {*} [opts] - 方法 $().bootstrapTable('refreshOptions', [arg]) 的参数
 * @param {*} [opts.customQuery] - 允许添加额外的查询参数
 * @param {boolean} [opts.convertEmptyStringToNull] - 把 opts.customQuery 中的空字符串转换成 null 值, 值默认是 true 转换
 * @returns {jQuery}
 */
_dataGrid.newQuery = function (jqElement, opts) {
  if (globalUtils.isNullOrUndefined(jqElement)) {
    throw new Error('argument#0 "jqElement" is null/undefined');
  }

  opts = globalUtils.emptyObjectIfNullOrUndefined(opts);
  var customQuery = globalUtils.emptyObjectIfNullOrUndefined(opts.customQuery);

  if (!(opts.convertEmptyStringToNull === false)) {
    // 空字符串转换成 null 值
    customQuery = globalUtils.convertEmptyStringToNull(customQuery);
  }

  var initOpts = {
    // 重置到第一页
    pageNumber: 1,
    queryParams: function (params) {
      var newParams = globalUtils.mergeObjects(customQuery, params);

      return newParams;
    }
  };

  var newOpts = globalUtils.mergeObjects(initOpts, opts);
  jqElement.bootstrapTable('refreshOptions', newOpts);

  return jqElement;
};

/**
 * @memberof uiUtils-dataGrid
 * @description 返回选中记录的 ID 数组
 * @param {jQuery} jqElement 
 * @param {string} [idPropName] 
 * @returns {any[]}
 */
_dataGrid.getIdSelections = function (jqElement, idPropName) {
  if (globalUtils.isNullOrUndefined(jqElement)) {
    throw new Error('argument#0 "jqElement" is null/undefined');
  }

  if (globalUtils.isNullOrUndefined(idPropName)) {
    throw new Error('argument#1 "idPropName" is null/undefined');
  }

  var rows = jqElement.bootstrapTable('getSelections');
  if (!(rows instanceof Array)) {
    return [];
  }

  var ids = rows.map(function (row) {
    return row[idPropName];
  });

  return ids;
};

/**
 * @memberof uiUtils-dataGrid
 * @description 返回记录的字段数据
 * @param {jQuery} jqElement 
 * @param {string} [fieldName] 
 * @returns {any[]}
 */
_dataGrid.getFieldData = function (jqElement, fieldName) {
  if (globalUtils.isNullOrUndefined(jqElement)) {
    throw new Error('argument#0 "jqElement" is null/undefined');
  }

  if (globalUtils.isNullOrUndefined(fieldName)) {
    throw new Error('argument#1 "fieldName" is null/undefined');
  }

  var rows = jqElement.bootstrapTable('getData');
  var values = rows.map(function (row) {
    return row[fieldName];
  });

  return values;
};

/**
 * @memberof uiUtils-dataGrid
 * @description 绑定复选框改变时的回调函数
 * @param {jQuery} jqElement 
 * @param {function} [callbackFn] 
 */
_dataGrid.onCheckBoxChange = function (jqElement, callbackFn) {
  if (globalUtils.isNullOrUndefined(jqElement)) {
    throw new Error('argument#0 "jqElement" is null/undefined');
  }

  if (globalUtils.isNullOrUndefined(callbackFn)) {
    throw new Error('argument#1 "callbackFn" is null/undefined');
  }

  jqElement.on('check.bs.table uncheck.bs.table ' +
    'check-all.bs.table uncheck-all.bs.table ' +
    'refresh.bs.table refresh-options.bs.table ' +
    'load-success.bs.table page-change.bs.table', function () {
      var rows = jqElement.bootstrapTable('getSelections');
      callbackFn(rows);
    });
};


_dataGrid.uiData = {};
uiData.Model.config.initDataHandlers.dataGrid = _dataGrid.uiData;

/**
 * @description 获取表格数据
 * @param {Element[]} elements DOM元素
 * @param {boolean} skipNull 是否跳过 null 值
 * @returns {*}
 */
_dataGrid.uiData.getValue = function (elements, skipNull) {
  var jqElement = jQuery(elements[0]);
  var data = jqElement.bootstrapTable('getData');

  // 若未初始化则获取到的数据不是数组
  if (!(data instanceof Array)) {
    return [];
  }

  return _.cloneDeep(data);
};

/**
 * @description 设置表格数据
 * @param {Element[]} elements DOM元素
 * @param {*} value 值
 * @param {boolean} defaultNull 是否默认 null 值
 */
_dataGrid.uiData.setValue = function (elements, value, defaultNull) {
  var jqElement = jQuery(elements[0]);

  jqElement.bootstrapTable('load', (value || []));
};

/* SOURCE-CODE-END */

export { uiUtils, _dataGrid };
